Objective-C pitanjce
(1 korsinik/a gleda/ju temu) (1) Gost

Objective-C pitanjce


  • Law
  • Korisnik
  • 6
13.11.2009 | 14:33
Može li mi netko pojasniti u čemu je razlika između ova dva primjera i zašto se u jednom slučaju javlja greška, a u drugom ne? Radi se o maloj app za iPhone (ali mislim da je svejedno, da se odnosi i na MacOS X development).

Imam jedan UIViewController, i jednu klasu koja mi služi za SOAP komunikaciju (ovaj primjer radi ok):
//.h file
@interface Hello_SOAPViewController : UIViewController
{
	IBOutlet UITextField *nameInput;
	IBOutlet UILabel *greeting;
}

@property(nonatomic, retain) IBOutlet UITextField *nameInput;
@property(nonatomic, retain) IBOutlet UILabel *greeting;

-(IBAction)pingClick: (id) sender;
@end

//.m file
#import "Hello_SOAPViewController.h"
#import "GWS_LeasingSvc.h"
@implementation Hello_SOAPViewController

@synthesize greeting, nameInput;

-(IBAction)pingClick:(id) sender
{
        GWS_LeasingSoap *soapCall = [[GWS_LeasingSvc GWS_LeasingSoap] retain];
	soapCall.logXMLInOut = YES;
	soapCall.authUsername = @"user";
	soapCall.authPassword = @"pass";
	GWS_LeasingSvc_Ping *cRequest = [[GWS_LeasingSvc_Ping new] autorelease];
	[soapCall PingAsyncUsingParameters:cRequest delegate:self];
        [nameInput resignFirstResponder];
}

- (void) operation:(GWS_LeasingSoapOperation *) operation 
completedWithResponse:(GWS_LeasingSoapResponse *) response
{
	NSArray *responseHeaders = response.headers;
	NSArray *responseBodyParts = response.bodyParts;
	
	for(id header in responseHeaders) {
        ....
	}
	
	for(id bodyPart in responseBodyParts) {
		if ([bodyPart isKindOfClass:[SOAPFault class]]) {
		       greeting.text = ((SOAPFault *)bodyPart).simpleFaultString;
			continue;
		}
				
		if([bodyPart isKindOfClass:[GWS_LeasingSvc_PingResponse class]]) { 
			GWS_LeasingSvc_PingResponse *body = (GWS_LeasingSvc_PingResponse*)bodyPart;
			greeting.text = body.PingResult;
			continue;
		}
	}	
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
	// Return YES for supported orientations
	return (interfaceOrientation == UIInterfaceOrientationPortrait);
}


- (void)didReceiveMemoryWarning {
	[super didReceiveMemoryWarning]; 
}

- (void)dealloc 
{
	[super dealloc];
}
@end
  • Law
  • Korisnik
  • 6
13.11.2009 | 14:41
Nastavak:

E sad sam ja dodao još jednu klasu koja bi mi bila između UIViewControllera
i klase koja radi samu SOAP komunikaciju iz razloga što ta klasa ima jedno
50-tak različitih poziva pa da mi to sve nije u UIViewControlleru.

Ovako sam to prepravio:
//.h file
@interface Hello_SOAPViewController : UIViewController
{
IBOutlet UITextField *nameInput;
IBOutlet UILabel *greeting;
}

@property(nonatomic, retain) IBOutlet UITextField *nameInput;
@property(nonatomic, retain) IBOutlet UILabel *greeting;

-(IBAction)pingClick: (id) sender;
@end

//.m file
#import "Hello_SOAPViewController.h"
#import "GWS_Leasing_Delegate.h"
@implementation Hello_SOAPViewController

@synthesize greeting, nameInput;

-(IBAction)pingClick:(id) sender
{
        GWS_Leasing_Delegate *gLeasing = [[GWS_Leasing_Delegate alloc] init];
	[gLeasing runPing];
	greeting.text = gLeasing.result;
	[nameInput resignFirstResponder];
	[gLeasing release];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
 {
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning]; 
}


- (void)dealloc 
{
[super dealloc];
}
@end


//.h 
#import <Foundation/Foundation.h>
#import "GWS_LeasingSvc.h"

@interface GWS_Leasing_Delegate: NSObject <GWS_LeasingSoapResponseDelegate>{
	NSMutableString *result;
	GWS_LeasingSoap *soapCall;
}
@property(nonatomic,retain) NSMutableString *result;
@property(nonatomic,retain) GWS_LeasingSoap *soapCall;

-(void)runPing;
@end

//.m file
#import "GWS_Leasing_Delegate.h"
@implementation GWS_Leasing_Delegate 

@synthesize result,soapCall;

-(id) init
{
	self = [super init];
	if (!result) {
		result=[[NSMutableString alloc] init];
	}
	
	if(!soapCall){
		soapCall = [[GWS_LeasingSvc GWS_LeasingSoap] retain];
	}
	return self;
}
-(void) runPing
{
	soapCall.logXMLInOut = YES;
	soapCall.authUsername = @"user";
	soapCall.authPassword = @"pass";
	GWS_LeasingSvc_Ping *cRequest = [[GWS_LeasingSvc_Ping new]autorelease];
	[soapCall PingAsyncUsingParameters:cRequest delegate:self];
		
}

- (void) operation:(GWS_LeasingSoapOperation*)operation 
completedWithResponse:(GWS_LeasingSoapResponse*)response
{
	NSArray *responseHeaders = response.headers;
	NSArray *responseBodyParts = response.bodyParts;
	
	for(id bodyPart in responseBodyParts) {
		if ([bodyPart isKindOfClass:[SOAPFault class]]) {
			
                [result appendString:((SOAPFault *)bodyPart).simpleFaultString];
		continue;
		}
		
		if([bodyPart isKindOfClass:[GWS_LeasingSvc_PingResponse class]]) { 
		GWS_LeasingSvc_PingResponse *body = (GWS_LeasingSvc_PingResponse*)bodyPart;
			
                 [result appendString: body.PingResult];
		continue;
		}
	}
}

-(void)dealloc
{
	[result release];
	[soapCall release];
	[super dealloc];
}
@end



Kad ovako napravim build XCode kaže Succeeded, ali kad pokrenem App
i kliknem taj ping program pukne i javi slijedeće:

2009-11-13 14:05:32.430 NOVASOAP[2943:207]
*** -[NSURLRequestInternal operation:completedWithResponse:]:
unrecognized selector sent to instance 0x227a00
2009-11-13 14:05:32.442 NOVASOAP[2943:207]
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'*** -[NSURLRequestInternal operation:completedWithResponse:]:
unrecognized selector sent to instance 0x227a00'
13.11.2009 | 17:30
Imaš dva propertija i tri synthesize...

@property(nonatomic, retain) IBOutlet UITextField *nameInput;
@property(nonatomic, retain) IBOutlet UILabel *greeting;

@synthesize greeting, nameInput, responseView;

Nakon toga mi je postalo teško čitati dalje. Jel to Jabučnjak unakazio razmake ili... ?

Igor
  • Law
  • Korisnik
  • 6
13.11.2009 | 17:54
Evo ispravio sam, ali nije bilo do toga krivo sam copy paste. Ali stvarno izgleda katastrofa za čitat.

Najbitnije je dio onaj

- (void) operation:(GWS_LeasingSoapOperation*)operation completedWithResponse:(GWS_LeasingSoapResponse*)response

ako se nalazi u ViewController-u i sama instanca klase koja radi SOAP se nalazi u ViewControlleru onda sve radi
ok. Ako pak to sve prebacim u novu klasu onda počinju problemi.

Lp,
Nenad
13.11.2009 | 20:24
Pričam napamet, ali u prvom primjeru je sporna metoda dio klase koja nasljeđuje UIViewController, a u drugom NSObject. Jel' moguće da metoda koristi "nešto" što je defaultno nasljeđeno u UIViewController, a "ne postoji" na vrhu hijerarhije, u NSObjectu?
  • Law
  • Korisnik
  • 6
13.11.2009 | 23:28
Djipi je napisao:
Pričam napamet, ali u prvom primjeru je sporna metoda dio klase koja nasljeđuje UIViewController, a u drugom NSObject. Jel' moguće da metoda koristi "nešto" što je defaultno nasljeđeno u UIViewController, a "ne postoji" na vrhu hijerarhije, u NSObjectu?


Tražim što bi moglo biti to "nešto" ali nikako da nađem
Kad u XCode-u stistem desni gumb na tu spornu metodu i kliknem jump to definition dobijem:

@class GWS_LeasingSoapResponse;
@class GWS_LeasingSoapOperation;
@protocol GWS_LeasingSoapResponseDelegate <NSObject>
- (void) operation:(GWS_LeasingSoapOperation *)operation completedWithResponse:(GWS_LeasingSoapResponse *)response;
@end


@interface GWS_LeasingSoapOperation : NSOperation {
GWS_LeasingSoap *binding;
GWS_LeasingSoapResponse *response;
id<GWS_LeasingSoapResponseDelegate> delegate;
NSMutableData *responseData;
NSURLConnection *urlConnection;
}
@property (retain) GWS_LeasingSoap *binding;
@property (readonly) GWS_LeasingSoapResponse *response;
@property (nonatomic, assign) id<GWS_LeasingSoapResponseDelegate> delegate;
@property (nonatomic, retain) NSMutableData *responseData;
@property (nonatomic, retain) NSURLConnection *urlConnection;
- (id)initWithBinding:(GWS_LeasingSoap *)aBinding delegate:(id<GWS_LeasingSoapResponseDelegate>)aDelegate;
@end

@interface GWS_LeasingSoapResponse : NSObject {
NSArray *headers;
NSArray *bodyParts;
NSError *error;
}
@property (retain) NSArray *headers;
@property (retain) NSArray *bodyParts;
@property (retain) NSError *error;
@end
13.11.2009 | 23:56
Ovo:
-(IBAction)pingClick:(id) sender
{
   GWS_Leasing_Delegate *gLeasing = [[GWS_Leasing_Delegate alloc] init];
   [gLeasing runPing];
   greeting.text = gLeasing.result;
   [nameInput resignFirstResponder];
   [gLeasing release];                // AJ, MAKNI OVAJ RED!!!
}



Sad kad si postao i ovaj zadnji dio sjetio sam se jedne stvari. Delegati se nikad ne retainaju u klasi koja ih poziva da bi se izbjeglo ciklično dealociranje (ili tako neki izraz). Da se naslutiti iz ovog reda:

@property (nonatomic, assign) id<GWS_LeasingSoapResponseDelegate> delegate;

Probaj pa javi.

Igor
14.11.2009 | 00:01
Tko točno u cijeloj ovoj priči poziva [NSURLRequestInternal operation:completedWithResponse:]?
14.11.2009 | 00:05
I, usput, ako ovo što je IgorD predložio ne pomogne - možeš li s debugerom provjeriti koji se to konkretno "unrecognized selector" prosljeđuje?
  • Law
  • Korisnik
  • 6
14.11.2009 | 00:15
Da skužio sam i ja da treba maknuti onaj [gLeasing release];
Pretpostavljam da je bio problem u tome što je interno gLeasing još uvijek čekao odgovor a ja sam ga release-o. Sad još samo moram smisliti kako naknadno prikazati gLeasing.result u kontroli greeting u mom ViewControlleru. Jer ako napišem:

gLeasing = [[GWS_Leasing_Wrapper alloc] init];
[gLeasing runPing];
greeting.text = gLeasing.result;


Tu je još gLeasing.result prazan još se nije desila ona metoda sa odgovorom web servisa.
  • Law
  • Korisnik
  • 6
14.11.2009 | 00:23
Djipi je napisao:
Tko točno u cijeloj ovoj priči poziva [NSURLRequestInternal operation:completedWithResponse:]?


Prema kodu je to onaj GWS_LeasingSoapOperation jer on ima metode gdje se sa NSURL spaja na web servis. Cijeli ovaj kod sam dobio pomoću jednog programa koji iz WSDL (opis web servisa) generira Objective-C kod tako da nije mojih ruku djelo.
14.11.2009 | 00:24
Da skužio sam i ja da treba maknuti onaj [gLeasing release];


Znači to je,

ok - onda dodaš stvar kao instance varijablu u ViewController i radiš release tek u metodi -dealloc za kontroler. A onda nek ona delegate metoda signalizira kontroleru da je sve gotovo.

Dodaj toj klasi metodu -initWithController: tak da ima interni pointer na njega i onda nek mu signalizira pozivom neke metode da je sve gotovo.

Igor
  • Law
  • Korisnik
  • 6
14.11.2009 | 01:13
Hvala momci!!!

Eto riješih sve probleme

Sad sve izgleda ovako:
#import <UIKit/UIKit.h>
#import "GWS_Leasing_Wrapper.h"

@interface Hello_SOAPViewController : UIViewController
{
	IBOutlet UITextField *nameInput;
	IBOutlet UILabel *greeting;
	GWS_Leasing_Wrapper *gLeasing;
}

@property(nonatomic, retain) IBOutlet UITextField *nameInput;
@property(nonatomic, retain) IBOutlet UILabel *greeting;

-(IBAction)buttonClick: (id) sender;
-(IBAction)pingClick: (id) sender;
-(void)showgLeasingResult;
@end

#import "Hello_SOAPViewController.h"

@implementation Hello_SOAPViewController

@synthesize greeting, nameInput;

-(IBAction)pingClick:(id) sender
{
	gLeasing = [[GWS_Leasing_Wrapper alloc] initWithController:self];
	[gLeasing runPing];
	[nameInput resignFirstResponder];
}

-(void)showgLeasingResult
{
	greeting.text=gLeasing.result;
}
.....
@end


#import <Foundation/Foundation.h>
#import "GWS_LeasingSvc.h"
@class Hello_SOAPViewController;

@interface GWS_Leasing_Wrapper: NSObject <GWS_LeasingSoapResponseDelegate>{
	NSMutableString *result;
	GWS_LeasingSoap *soapCall;
	bool asyncTaskFinished;
	Hello_SOAPViewController *contr;
}
@property(nonatomic,retain) NSMutableString *result;
@property(nonatomic,retain) GWS_LeasingSoap *soapCall;
@property(nonatomic,assign) bool asyncTaskFinished;
@property(nonatomic,retain) Hello_SOAPViewController *contr;

-(void)runPing;
-(bool)didAsyncTaskFinished;
-(id)initWithController:(Hello_SOAPViewController *)controller;
@end


#import "GWS_Leasing_Wrapper.h"
#import "Hello_SOAPViewController.h"

@implementation GWS_Leasing_Wrapper 

@synthesize result,soapCall,asyncTaskFinished, contr;

-(id) initWithController:(Hello_SOAPViewController *)controller
{
	if(self = [super init])
	{
		if (!result) {
		      self.result=[[NSMutableString alloc] init];
		}
	
		if(!soapCall){
		      self.soapCall = [[GWS_LeasingSvc GWS_LeasingSoap] retain];
		}
		self.contr=controller;
	}
	
	return self;
}
-(void) runPing
{
	soapCall.logXMLInOut = YES;
	soapCall.authUsername = @"user";
	soapCall.authPassword = @"pass";
	GWS_LeasingSvc_Ping *cRequest = [[GWS_LeasingSvc_Ping new]autorelease];
	[soapCall PingAsyncUsingParameters:cRequest delegate:self];
		
}

- (void) operation:(GWS_LeasingSoapOperation*)operation 
completedWithResponse:(GWS_LeasingSoapResponse*)response
{
	NSArray *responseHeaders = response.headers;
	NSArray *responseBodyParts = response.bodyParts;
	
	for(id bodyPart in responseBodyParts) {
		if ([bodyPart isKindOfClass:[SOAPFault class]]) {
			[self.result appendString:((SOAPFault *)bodyPart).simpleFaultString];
			continue;
		}
		if([bodyPart isKindOfClass:[GWS_LeasingSvc_PingResponse class]]) { 
			GWS_LeasingSvc_PingResponse *body = (GWS_LeasingSvc_PingResponse*)bodyPart;
			[self.result appendString: body.PingResult];
			
			self.asyncTaskFinished=YES;
			continue;
		}
	}
	[contr showgLeasingResult];
	
}


-(bool)didAsyncTaskFinished
{
	return self.asyncTaskFinished;
}

-(void)dealloc
{
	[result release];
	[soapCall release];
	[super dealloc];
}
@end
14.11.2009 | 02:19
Cool,

i da sve bude savršeno:

-(void)dealloc
{
   [result release];
   [soapCall release];

   [contr release];

   [super dealloc];
}
  • Law
  • Korisnik
  • 6
14.11.2009 | 19:49
IgorD je napisao:
Cool,

i da sve bude savršeno:

-(void)dealloc
{
   [result release];
   [soapCall release];

   [contr release];

   [super dealloc];
}


E vidiš to sa [contr release]; se nisam usudio napraviti jer mene još uvijek hebe to sve pointerisanje. Ja dolazim prvenstveno iz svijeta SQL-a (to radim za pare) i .NET-a gdje tih pointera nema. Mislio sam ako release-am contr da ću i glavni view release-ati. Ako dobro kužim onda contr pokazuje na memorijsku lokaciju na kojoj se nalazi pointer koji pokazuje gdje se nalazi UIViewController i onda ako ja nešto od toga release-am sve ode u klinac.... uf al sam ga skomplicirao....... Sad ću ipak na tvoj savjet to dodati i probati jel šljaka.... Moram ja te knjige ipak počet čitati (makar mi se iskreno ne da)...
14.11.2009 | 22:38
Ovo je alociranje i oslobađanje memorije, ali ne u onom smislu kako je to napravljeno u običnom C-u već je ovdje to malo drukčije.

U standardnom C-u memoriju dobijaš sa malloc(), a oslobađaš sa free(). Maloc ti garantirano vrati novi blok memorije (ili NULL ako nema mjesta) a free() garantirano to onda vrati sistemu i oslobodi za daljnje korištenje.

U Objective-Cu to nije tako iako se možda čini da je. Ovdje se to svodi na "ownership" - često to tako nazivaju pa se ni meni ne da izmišljati novi izraz. Interno postoji "reference count" za neki komad memorije i na početku je on jedan. Ako odmah pozoveš -release, taj ref count se umanji i kad je nula, onda se poziva -dealloc. U suprotnom objekt i dalje postoji. Metoda -release nije nužno i -dealloc.

Ovaj red je napravio retain:

self.contr=controller;

Na kraju je vrijeme da kažeš da ti contr više ne treba sa -release.

Igor
Moderatori: Bertone
  • Stranica:
  • 1

Vikalica™

Zadnja poruka: pred 1 sat, 32 minuta
  • Bertone: Gdje? Ja vidim samo stari nedostupni M2 za 799
  • stefanjos: 799
  • stefanjos: a evo ih
  • stefanjos: dobro sto ovaj istyle ceka sa ponudom...
  • Zdravac: na Apple Mađarska su cijene kao u DE, a može se odabrati HR tipkovnica
  • m@xym: Naravno, sve to ne vrijedi za naše tržište jer kod nas vrijede neka druga pravila.... Kod nas je Air sa 8 GB 200 € skuplji of Air-a sa 16 GB u Njemačkoj.
  • m@xym: Zašto bi inače Apple davao "besplatan" i tihi upgrade za baš sve strojeve iz game (Studio čak počinje sa 32 GB RAM-a i M2 MAX procesorom!!!)
  • m@xym: S obzirom da nitko ne daje nešto što ne mora, postavlja se pitanje kako će novi strojevi raditi sa 16 GB RAM-a i uključenim AI dijelom OS-a.... Možda su 32 GB upravo postala ono što je bilo 16 GB na starim strojevima...
  • Yonkis: Mora biti 16GB da bi korisnici imali UX za AI, sve manje od toga ne zadovoljava. Sami su si "jamu" iskopali, baš mi ih je žao :)
  • m@xym: Još samo da shvate da umjesto 256 GB trebaju staviti 1 TB SSD... za istu cijenu... :o)
  • m@xym: Ne samo Air-ovi, nego i svi ostali... Očito je Apple AI veliki potrošač memorije.
  • Piko: Ne znam da li je itko uočio ... Ali svi Airovi dolaze po defaultu sa 16 GB RAM-a .... a cijena ista kao i prije za 8 :)
  • dpasaric: Evo i MacBook Pro M4...
  • mbp2009: nece ni biti jos
  • stefanjos: na istyleeu i dalje nema cijena....
  • dpasaric: Eto osvrt na Mac mini M4 na naslovnici...
  • kupus: Evo, otvorit ću temu pa da ne pisemo ovdje
  • kupus: Hvala Bertone
  • Bertone: *ništ
  • Bertone: @kupus, pa nije to nišz novo oko audio izlaza s prednje strane, HDMI će otpeljati zvuk u monitor, a večina današnjih monitora ima audio out priključak.
  • stefanjos: mea culpa
  • stefanjos: kupus, sada kuzim sto si mislio. mislio sam na ovu ogavnu naslovnicu koju su stavili ovi lol
  • imar: Imam osjećaj da će se ovaj novi Mac Mini prodavati ko' vruće kifle.. :D
  • dpasaric: Top model Mac minija = 4.700 € hahahahahah
  • dpasaric: [link]
  • dpasaric: Evo novi Mini je vani!
  • MoschuS: DE Store ima cijene 699, 929, 1159 i 1649 za Pro
  • MoschuS: Bas i ja gledam taj 3.5mm jack i pitam se zasto je naprijed!?
  • kupus: Minusi : ista cijena storage upgradea, headphone jack s prednje strane? Kako misle spojiti zvucnike na to?
  • kupus: Plusevi : 3 monitora, gigabit ethernet kao standard, ista početna cijena, 16gb ram
  • kupus: Legit je :) Jonny Ive je već dugo na aparatima, navodno i na lifesupportu otkad je vidio novi iMac :)
  • MoschuS: Evo i Minija ;)
  • kupus: Nije ni studio baš proprcionalan, ako ćemo tako
  • kupus: Vidi ove screenshotove, ne njihov render. Meni izgleda poprilično legit, a to i potvrđuje činjenica da su navedene screenshote i maknuli s weba
  • stefanjos: stvarno mislis da ce tako bez proporcionalno sranje izaci iz applea? doslovno se vidi da je fake
  • kupus: mini leakan, bar s prednje strane [link]
  • Piko: ma što se mene tiće ne mora imati slova gore .... ali mi treba svjetlo da nađem pepeljaru i upaljač :)
  • Yonkis: @piko očekuje se da je tipkanje na slijepo defaultno za usera.
  • Piko: magična tipkovnica još uvijek nema pozadinsko svjetlo .... ;-(
  • dpasaric: Evo novi iMac M4. Ništa zanimljivo nema, samo novi procesor i više memorije u osnovnoj konfiguraciji.
  • drlovric: Isto kao nedostatak hrvatskih titlova na Apple TV. A pokrili bi trziste 4-5 drzava sa tom malom modifikacijom slovenskih. Al ne moraju, pa sto bi :)
  • miomika: ma gle...ako mogu kotolirati sve te feture putem DNS-a po svakoj državi, zašto to onda uopće daju u EU. I zašto nema nigdje JASNO napisano. "Call record ne radi u cijeloj EU", točno se sojeća ono.....osveta za USB-C. ma Idiotizam na najjače..a tek one pizdarije da Aple One nije dostupan u .hr, ali je u Sloveniji....ma...sve više i više mi se sve to jako gadi
  • drlovric: Zao mi je samo ljudi koji su potrcali da kupe nove mobitele radi inteligencije. To ije bio bas inteligentan potez :D
  • drlovric: Sveje to jos uvijek poluproizvod, i zvanicno u Beta fazi. Imam osjecaj da ce se to taman popeglati dok dodje na EU trziste. Tako da, ne bih se ja tu nist aisjecao zakinutim ni nervirao :)
  • miomika: u banani....ko da smo u zimbabwe--u...mislim, ovo nadjebavanje EU-USA, preregulirana EU, oni stave update, koji niti jedan od fetaure-a ne radi. Da bi radilo, trebalo bi jailbreakat uređaj. Koja je poruka poslana ovime?
  • Zdravac: Do travnja 2025. ce proraditi i u EU
  • miomika: ja sam sad na drugom telefonu stavio svoj stari US AppleID i proradio je Call record i na čekanju sam s AI. pokušat ću s glupim trikom, ali mi je stvar preglupa.......
  • drlovric: Nakon pola sata aktivirali su mi AI. Siri animacija je prekrasna i moram priznati da je malo manje tupava. Neke stvari su iznenadjujuce dobre (za Siri). Ali nije to jos Google Assistant razina.
  • miomika: RU=EU :)
  • miomika: Ne radi niti RSC, niti previev summarize..MA NIŠTA!!!

Za vikanje moraš biti prijavljen.

Prijava

Prisutni jabučari

Novo na Jabučnjaku

Teme

Poruke

Oglasi

Komentari

Anketa

Koji Mac koristite?

Page Speed 0.99 Seconds

Provided by iJoomla SEO