Mitt första program

Tråden skapades och har fått 8 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Karlskrona
  • 2009-04-22 20:41

Tjenare!

Har kollat igenom en del föreläsningar och videos om Objective C och iPhone. Känner att jag börja förstå lite nu iaf. Så jag har äntligen börjat koda lite men körde fast direkt såklart

Har fyra frågor som jag skulle behöva bena ur om någon vänlig själ har tid att hjälpa.

1. (Minneshantering) När ska man använda alloc, retain, realease, copy och assign? Förklara gärna hur minneshanteringen fungerar lite kort

2. (Variabeldeklaration) Vad gör stjärnan som används ibland? Tex. NSString *myString; ?

3. Vad betyder nonatomic när man skapar en @property

4. När jag nu har börjat med mitt första program gick jag bet direkt och har inte en aning om hur jag ska lösa det. Så jag tänkte någon här skulle kanske kunna hjälpa mig. Problemet uppkommer när jag provade att göra en getter och setter på min egna klass. När jag sätter något i settern så krashar hela programmet så jag antar att det är något med minneshanteringen att göra. Såhär ser mina filer ut:

I min appDelegate:

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    
	MyClass *person = [[MyClass alloc] init];
	//[person name:@Andreas];
	person.age = 20;
	//person.name = @andreas;
	
    // Override point for customization after app launch    
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}

I min klass.h:

@interface MyClass : NSObject {
	int age;
	NSString *name;
}

@property(nonatomic, retain) NSString *name;
@property(nonatomic, assign) int age;

I min klass.m:

@synthesize name;
@synthesize age;

- (void)init {
	NSLog(@Class MyClass was initialized);
	self.name = @Andreas;
	self.age = 20;
}

Otroligt tacksam om någon kunde hjälpa mig att komma vidare!

  • Medlem
  • Stockholm
  • 2009-04-23 06:37

Är på väg till jobbet, men ville bara snabbt säga att din NSString aldrig skapas, den bara deklareras. * betyder pekare. Variabeln NSString *name är alltså en variabel som hållen en minnesadress till en NSString. Den kan alltså inte hålla @andreas, du måste skap objektet och använda en setter, eller som nedan en convenience method.

name = [[NSString alloc] initWithString:@andreas];

Vänligen, Ylan

  • Medlem
  • Karlskrona
  • 2009-04-23 10:33
Ursprungligen av Ylan:

Är på väg till jobbet, men ville bara snabbt säga att din NSString aldrig skapas, den bara deklareras. * betyder pekare. Variabeln NSString *name är alltså en variabel som hållen en minnesadress till en NSString. Den kan alltså inte hålla @andreas, du måste skap objektet och använda en setter, eller som nedan en convenience method.

name = [[NSString alloc] initWithString:@andreas];

Vänligen, Ylan

Ok, kan man säga att NSString bara deklarerades men objektet skapades aldrig? Då hänger jag nog med.

I sådana fall, så ska * användas på alla objekt som man behöver skapa nya instanser av. Dessa object behöver man också allokera minne till, eller? Om jag är ute och cyklar, varför behöver man då inte allokera minne till en int?

Hade varit super om du skulle vilja dra minneshanteringen lite kort.

Tack för hjälpen!

Ursprungligen av Ylan:

Är på väg till jobbet, men ville bara snabbt säga att din NSString aldrig skapas, den bara deklareras. * betyder pekare. Variabeln NSString *name är alltså en variabel som hållen en minnesadress till en NSString. Den kan alltså inte hålla @andreas, du måste skap objektet och använda en setter, eller som nedan en convenience method.

name = [[NSString alloc] initWithString:@andreas];

Vänligen, Ylan

Om man använder @property(nonatomic, copy) NSString *name; så skapas det väl en kopia av @andreas som man direkt kan använda så här: name = @andreas

Eller har jag fattat fel?

I din init-metod i klass.m måste du först anropa [super init] och tilldela self resultatet. Detta måste du göra innan du kan anropa några metoder på self (även Objective-C 2.0 property-tilldelningar är metodanrop).

  • Medlem
  • Karlskrona
  • 2009-04-23 10:33
Ursprungligen av Erik Aderstedt:

I din init-metod i klass.m måste du först anropa [super init] och tilldela self resultatet. Detta måste du göra innan du kan anropa några metoder på self (även Objective-C 2.0 property-tilldelningar är metodanrop).

Ahh, ok. Tack!

Som svar på din fråga 3...
nonatomic används om du är helt säker på att bara en enda tråd samtidigt kommer att använda ditt object. Det blir aningen effektivare. Men har du ett program som använder flera trådar (threads?) så ska du inte använda nonatomic, det kan leda till konflikter.
Om du inte använder nonatomic så undviker du alla sådana problem.

Hoppas att du förstår vad jag menar, jag är trött så förklaringen kanske inte blev helt begriplig!

  • Medlem
  • Karlskrona
  • 2009-04-23 23:23
Ursprungligen av KristerG:

Som svar på din fråga 3...
nonatomic används om du är helt säker på att bara en enda tråd samtidigt kommer att använda ditt object. Det blir aningen effektivare. Men har du ett program som använder flera trådar (threads?) så ska du inte använda nonatomic, det kan leda till konflikter.
Om du inte använder nonatomic så undviker du alla sådana problem.

Hoppas att du förstår vad jag menar, jag är trött så förklaringen kanske inte blev helt begriplig!

Kanske en dum fråga, men vad är en tråd/thread?

Ursprungligen av Epoxus:

Kanske en dum fråga, men vad är en tråd/thread?

Nej då, det är ingen dum fråga alls.

Du kan skriva ditt program så att flera delar av programmet kan arbeta samtidigt, till exempel så kan en tråd ta hand om grafiken och mus och tangentbords-inmatningen. En annan tråd kan ta hand om någon beräkning som tar lång tid. I framtiden lär vi får se processorer med ännu flera kärnor, och då blir det ännu viktigare att kunna använda flera trådar för att kunna utnyttja datorkraften maximalt.

Kortfattat så är en tråd (thread) en del av ditt program som kan köras parallellt med andra trådar. Alla program har minst en tråd och den kan sedan starta andra trådar för diverse ändamål. Andra kan säkert förklara det här bättre än vad jag kan

Du kan läsa om NSThread i dokumentationen i XCode, men jag vet inte om det är till så mycket hjälp...

1
Bevaka tråden